JavaScriptãã³ã¬ãŒã¿ãŒã培åºè§£èª¬ãæ§æãã¡ã¿ããŒã¿ããã°ã©ãã³ã°ã§ã®äœ¿çšäŸããã¹ããã©ã¯ãã£ã¹ãã³ãŒãã®ä¿å®æ§ãžã®åœ±é¿ãæ¢ããŸããå®è·µçãªäŸãšå°æ¥ã®å±æã玹ä»ã
JavaScriptãã³ã¬ãŒã¿ãŒïŒã¡ã¿ããŒã¿ããã°ã©ãã³ã°ã®å®è£
JavaScriptãã³ã¬ãŒã¿ãŒã¯ãã¯ã©ã¹ãã¡ãœãããããããã£ããã©ã¡ãŒã¿ãŒã«ã¡ã¿ããŒã¿ã远å ãããã®æ¯ãèãã宣èšçãã€åå©çšå¯èœãªæ¹æ³ã§å€æŽã§ãã匷åãªæ©èœã§ããããã¯ECMAScriptæšæºåããã»ã¹ã«ãããã¹ããŒãž3ã®ããããŒã¶ã«ã§ãããç¬èªã®ïŒãããã«ç°ãªãïŒå®è£ ãæã€TypeScriptã§åºã䜿çšãããŠããŸãããã®èšäºã§ã¯ãJavaScriptãã³ã¬ãŒã¿ãŒã®å æ¬çãªæŠèŠããã¡ã¿ããŒã¿ããã°ã©ãã³ã°ã«ããã圹å²ã«çŠç¹ãåœãŠãå®è·µçãªäŸãçšããŠãã®äœ¿çšæ³ã解説ããŸãã
JavaScriptãã³ã¬ãŒã¿ãŒãšã¯ïŒ
ãã³ã¬ãŒã¿ãŒã¯ããªããžã§ã¯ãã®æ§é ãå€ããã«ãã®æ©èœæ§ãæ¡åŒµãŸãã¯å€æŽãããã¶ã€ã³ãã¿ãŒã³ã§ããJavaScriptã«ãããŠããã³ã¬ãŒã¿ãŒã¯ã¯ã©ã¹ãã¡ãœãããã¢ã¯ã»ãµãŒãããããã£ããŸãã¯ãã©ã¡ãŒã¿ãŒã«ä»äžã§ããç¹æ®ãªçš®é¡ã®å®£èšã§ãã@èšå·ã®åŸã«ãè£
食ãããèŠçŽ ãå®çŸ©ããããšãã«å®è¡ããã颿°ãç¶ããŸãã
ãã³ã¬ãŒã¿ãŒããè£ é£ŸãããèŠçŽ ãå ¥åãšããŠåãåãããã®èŠçŽ ã®å€æŽçãè¿ããããŸãã¯ããã«åºã¥ããŠäœããã®å¯äœçšãå®è¡ãã颿°ãšèããŠãã ãããããã«ãããå ã®ã¯ã©ã¹ã颿°ãçŽæ¥å€æŽããããšãªããã¯ãªãŒã³ã§ãšã¬ã¬ã³ããªæ¹æ³ã§æ©èœã远å ã§ããŸãã
äž»èŠãªæŠå¿µïŒ
- ãã³ã¬ãŒã¿ãŒé¢æ°ïŒ
@èšå·ãåã«ä»ã颿°ãè£ é£ŸãããèŠçŽ ã«é¢ããæ å ±ãåãåããããã倿Žããããšãã§ããŸãã - è£ é£Ÿå¯Ÿè±¡èŠçŽ ïŒ è£ é£Ÿãããã¯ã©ã¹ãã¡ãœãããã¢ã¯ã»ãµãŒãããããã£ããŸãã¯ãã©ã¡ãŒã¿ãŒã
- ã¡ã¿ããŒã¿ïŒ ããŒã¿ãèšè¿°ããããŒã¿ããã³ã¬ãŒã¿ãŒã¯ãã°ãã°ã³ãŒãèŠçŽ ã«ã¡ã¿ããŒã¿ãé¢é£ä»ããããã«äœ¿çšãããŸãã
æ§æãšæ§é
ãã³ã¬ãŒã¿ãŒã®åºæ¬çãªæ§æã¯ä»¥äžã®éãã§ãïŒ
@decorator
class MyClass {
// Class members
}
ããã§ã@decoratorã¯ãã³ã¬ãŒã¿ãŒé¢æ°ã§ãããMyClassã¯è£
食ãããã¯ã©ã¹ã§ãããã³ã¬ãŒã¿ãŒé¢æ°ã¯ã¯ã©ã¹ãå®çŸ©ããããšãã«åŒã³åºãããã¯ã©ã¹å®çŸ©ã«ã¢ã¯ã»ã¹ããŠå€æŽããããšãã§ããŸãã
ãã³ã¬ãŒã¿ãŒã¯åŒæ°ãåãåãããšãã§ãããããã¯ãã³ã¬ãŒã¿ãŒé¢æ°èªäœã«æž¡ãããŸãïŒ
@loggable(true, "Custom Message")
class MyClass {
// Class members
}
ãã®å Žåãloggableã¯ãã³ã¬ãŒã¿ãŒãã¡ã¯ããªé¢æ°ã§ãããåŒæ°ãåãåã£ãŠå®éã®ãã³ã¬ãŒã¿ãŒé¢æ°ãè¿ããŸããããã«ãããããæè»ã§èšå®å¯èœãªãã³ã¬ãŒã¿ãŒãå¯èœã«ãªããŸãã
ãã³ã¬ãŒã¿ãŒã®çš®é¡
ãã³ã¬ãŒã¿ãŒã«ã¯ãäœãè£ é£Ÿãããã«å¿ããŠç°ãªãçš®é¡ããããŸãïŒ
- ã¯ã©ã¹ãã³ã¬ãŒã¿ãŒïŒ ã¯ã©ã¹ã«é©çšãããŸãã
- ã¡ãœãããã³ã¬ãŒã¿ãŒïŒ ã¯ã©ã¹å ã®ã¡ãœããã«é©çšãããŸãã
- ã¢ã¯ã»ãµãŒãã³ã¬ãŒã¿ãŒïŒ getterããã³setterã¢ã¯ã»ãµãŒã«é©çšãããŸãã
- ããããã£ãã³ã¬ãŒã¿ãŒïŒ ã¯ã©ã¹ã®ããããã£ã«é©çšãããŸãã
- ãã©ã¡ãŒã¿ãŒãã³ã¬ãŒã¿ãŒïŒ ã¡ãœããã®ãã©ã¡ãŒã¿ãŒã«é©çšãããŸãã
ã¯ã©ã¹ãã³ã¬ãŒã¿ãŒ
ã¯ã©ã¹ãã³ã¬ãŒã¿ãŒã¯ãã¯ã©ã¹ã®æ¯ãèãã倿ŽãŸãã¯æ¡åŒµããããã«äœ¿çšãããŸããã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒæ°ãšããŠåãåããå ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã眮ãæããæ°ããã³ã³ã¹ãã©ã¯ã¿ãŒãè¿ãããšãã§ããŸããããã«ããããã®ã³ã°ãäŸåæ§ã®æ³šå ¥ããŸãã¯ç¶æ 管çãªã©ã®æ©èœã远å ã§ããŸãã
äŸïŒ
function loggable(constructor: Function) {
console.log("Class " + constructor.name + " was created.");
}
@loggable
class User {
name: string;
constructor(name: string) {
this.name = name;
}
}
const user = new User("Alice"); // åºåïŒ Class User was created.
ãã®äŸã§ã¯ãloggableãã³ã¬ãŒã¿ãŒã¯Userã¯ã©ã¹ã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããããã³ã«ã³ã³ãœãŒã«ã«ã¡ãã»ãŒãžããã°åºåããŸããããã¯ãããã°ãç£èŠã«åœ¹ç«ã¡ãŸãã
ã¡ãœãããã³ã¬ãŒã¿ãŒ
ã¡ãœãããã³ã¬ãŒã¿ãŒã¯ãã¯ã©ã¹å ã®ã¡ãœããã®æ¯ãèãã倿Žããããã«äœ¿çšãããŸãã以äžã®åŒæ°ãåãåããŸãïŒ
targetïŒã¯ã©ã¹ã®ãããã¿ã€ããpropertyKeyïŒã¡ãœããã®ååãdescriptorïŒã¡ãœããã®ããããã£èšè¿°åã
èšè¿°åã䜿çšãããšãã¡ãœãããä»å çãªããžãã¯ã§ã©ããããããå®å šã«åå®çŸ©ããããããªã©ãã¡ãœããã®æ¯ãèãã«ã¢ã¯ã»ã¹ããŠå€æŽã§ããŸãã
äŸïŒ
function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Calling method ${propertyKey} with arguments: ${args}`);
const result = originalMethod.apply(this, args);
console.log(`Method ${propertyKey} returned: ${result}`);
return result;
};
return descriptor;
}
class Calculator {
@logMethod
add(a: number, b: number): number {
return a + b;
}
}
const calculator = new Calculator();
const sum = calculator.add(5, 3); // ã¡ãœããåŒã³åºããšæ»ãå€ã®ãã°ãåºå
ãã®äŸã§ã¯ãlogMethodãã³ã¬ãŒã¿ãŒã¯ã¡ãœããã®åŒæ°ãšæ»ãå€ããã°åºåããŸããããã¯ãããã°ãããã©ãŒãã³ã¹ç£èŠã«åœ¹ç«ã¡ãŸãã
ã¢ã¯ã»ãµãŒãã³ã¬ãŒã¿ãŒ
ã¢ã¯ã»ãµãŒãã³ã¬ãŒã¿ãŒã¯ã¡ãœãããã³ã¬ãŒã¿ãŒã«äŒŒãŠããŸãããgetterããã³setterã¢ã¯ã»ãµãŒã«é©çšãããŸããã¡ãœãããã³ã¬ãŒã¿ãŒãšåãåŒæ°ãåãåããã¢ã¯ã»ãµãŒã®æ¯ãèãã倿Žã§ããŸãã
äŸïŒ
function validate(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalSet = descriptor.set;
descriptor.set = function (value: any) {
if (value < 0) {
throw new Error("Value must be non-negative.");
}
originalSet.call(this, value);
};
}
class Temperature {
private _celsius: number;
constructor(celsius: number) {
this._celsius = celsius;
}
@validate
set celsius(value: number) {
this._celsius = value;
}
get celsius(): number {
return this._celsius;
}
}
const temperature = new Temperature(25);
temperature.celsius = 30; // æå¹
// temperature.celsius = -10; // ãšã©ãŒãã¹ããŒ
ãã®äŸã§ã¯ãvalidateãã³ã¬ãŒã¿ãŒã¯æž©åºŠã®å€ãéè² ã§ããããšãä¿èšŒããŸããããã¯ããŒã¿ã®æŽåæ§ã匷å¶ããã®ã«åœ¹ç«ã¡ãŸãã
ããããã£ãã³ã¬ãŒã¿ãŒ
ããããã£ãã³ã¬ãŒã¿ãŒã¯ãã¯ã©ã¹ã®ããããã£ã®æ¯ãèãã倿Žããããã«äœ¿çšãããŸãã以äžã®åŒæ°ãåãåããŸãïŒ
targetïŒã¯ã©ã¹ã®ãããã¿ã€ãïŒã€ã³ã¹ã¿ã³ã¹ããããã£ã®å ŽåïŒãŸãã¯ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒïŒéçããããã£ã®å ŽåïŒãpropertyKeyïŒããããã£ã®ååã
ããããã£ãã³ã¬ãŒã¿ãŒã¯ãã¡ã¿ããŒã¿ãå®çŸ©ããããããããã£ã®èšè¿°åã倿Žãããããããã«äœ¿çšã§ããŸãã
äŸïŒ
function readonly(target: any, propertyKey: string) {
Object.defineProperty(target, propertyKey, {
writable: false,
});
}
class Configuration {
@readonly
apiUrl: string = "https://api.example.com";
}
const config = new Configuration();
// config.apiUrl = "https://newapi.example.com"; // strictã¢ãŒãã§ã¯ãšã©ãŒãã¹ããŒ
ãã®äŸã§ã¯ãreadonlyãã³ã¬ãŒã¿ãŒã¯apiUrlããããã£ãèªã¿åãå°çšã«ããåæååŸã«å€æŽãããã®ãé²ããŸããããã¯äžå€ã®èšå®å€ãå®çŸ©ããã®ã«åœ¹ç«ã¡ãŸãã
ãã©ã¡ãŒã¿ãŒãã³ã¬ãŒã¿ãŒ
ãã©ã¡ãŒã¿ãŒãã³ã¬ãŒã¿ãŒã¯ãã¡ãœãããã©ã¡ãŒã¿ãŒã®æ¯ãèãã倿Žããããã«äœ¿çšãããŸãã以äžã®åŒæ°ãåãåããŸãïŒ
targetïŒã¯ã©ã¹ã®ãããã¿ã€ãïŒã€ã³ã¹ã¿ã³ã¹ã¡ãœããã®å ŽåïŒãŸãã¯ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒïŒéçã¡ãœããã®å ŽåïŒãpropertyKeyïŒã¡ãœããã®ååãparameterIndexïŒã¡ãœããã®ãã©ã¡ãŒã¿ãŒãªã¹ãã«ããããã©ã¡ãŒã¿ãŒã®ã€ã³ããã¯ã¹ã
ãã©ã¡ãŒã¿ãŒãã³ã¬ãŒã¿ãŒã¯ä»ã®çš®é¡ã®ãã³ã¬ãŒã¿ãŒããã䜿çšé »åºŠã¯äœãã§ãããå ¥åãã©ã¡ãŒã¿ãŒã®æ€èšŒãäŸåæ§ã®æ³šå ¥ã«åœ¹ç«ã¡ãŸãã
äŸïŒ
function required(target: any, propertyKey: string, parameterIndex: number) {
const existingRequiredParameters: number[] = Reflect.getOwnMetadata(propertyKey, target, "required") || [];
existingRequiredParameters.push(parameterIndex);
Reflect.defineMetadata(propertyKey, existingRequiredParameters, target, "required");
}
function validateMethod(target: any, propertyName: string, descriptor: PropertyDescriptor) {
let method = descriptor.value!;
descriptor.value = function () {
let requiredParameters: number[] = Reflect.getOwnMetadata(propertyName, target, "required");
if (requiredParameters) {
for (let parameterIndex of requiredParameters) {
if (arguments[parameterIndex] === null || arguments[parameterIndex] === undefined) {
throw new Error(`Missing required argument at index ${parameterIndex}`);
}
}
}
return method.apply(this, arguments);
};
}
class ArticleService {
create(
@required title: string,
@required content: string
): void {
console.log(`Creating article with title: ${title} and content: ${content}`);
}
}
const service = new ArticleService();
// service.create("My Article", null); // ãšã©ãŒãã¹ããŒ
service.create("My Article", "Article Content"); // æå¹
ãã®äŸã§ã¯ãrequiredãã³ã¬ãŒã¿ãŒã¯ãã©ã¡ãŒã¿ãŒãå¿
é ãšããŠããŒã¯ããvalidateMethodãã³ã¬ãŒã¿ãŒã¯ãããã®ãã©ã¡ãŒã¿ãŒãnullã§ãundefinedã§ããªãããšãä¿èšŒããŸããããã¯ã¡ãœããã®å
¥åæ€èšŒã匷å¶ããã®ã«åœ¹ç«ã¡ãŸãã
ãã³ã¬ãŒã¿ãŒã«ããã¡ã¿ããŒã¿ããã°ã©ãã³ã°
ãã³ã¬ãŒã¿ãŒã®æã匷åãªäœ¿çšäŸã®äžã€ã¯ã¡ã¿ããŒã¿ããã°ã©ãã³ã°ã§ããã¡ã¿ããŒã¿ãšã¯ããŒã¿ã«é¢ããããŒã¿ã®ããšã§ããããã°ã©ãã³ã°ã®æèã§ã¯ãã³ãŒãã®æ§é ãæ¯ãèããç®çãèšè¿°ããããŒã¿ã§ãããã³ã¬ãŒã¿ãŒã¯ãã¯ã©ã¹ãã¡ãœãããããããã£ããã©ã¡ãŒã¿ãŒã«ã¡ã¿ããŒã¿ãé¢é£ä»ããããã®ã¯ãªãŒã³ã§å®£èšçãªæ¹æ³ãæäŸããŸãã
Reflect Metadata API
Reflect Metadata APIã¯ããªããžã§ã¯ãã«é¢é£ä»ããããã¡ã¿ããŒã¿ãä¿åããã³ååŸã§ããæšæºAPIã§ãã以äžã®é¢æ°ãæäŸããŸãïŒ
Reflect.defineMetadata(key, value, target, propertyKey)ïŒãªããžã§ã¯ãã®ç¹å®ã®ããããã£ã«å¯ŸããŠã¡ã¿ããŒã¿ãå®çŸ©ããŸããReflect.getMetadata(key, target, propertyKey)ïŒãªããžã§ã¯ãã®ç¹å®ã®ããããã£ã®ã¡ã¿ããŒã¿ãååŸããŸããReflect.hasMetadata(key, target, propertyKey)ïŒãªããžã§ã¯ãã®ç¹å®ã®ããããã£ã«ã¡ã¿ããŒã¿ãååšãããã©ããã確èªããŸããReflect.deleteMetadata(key, target, propertyKey)ïŒãªããžã§ã¯ãã®ç¹å®ã®ããããã£ã®ã¡ã¿ããŒã¿ãåé€ããŸãã
ãããã®é¢æ°ããã³ã¬ãŒã¿ãŒãšçµã¿åãããŠäœ¿çšããããšã§ãã³ãŒãèŠçŽ ã«ã¡ã¿ããŒã¿ãé¢é£ä»ããããšãã§ããŸãã
äŸïŒã¡ã¿ããŒã¿ã®å®çŸ©ãšååŸ
import 'reflect-metadata';
const logKey = "log";
function log(message: string) {
return function (target: any, key: string, descriptor: PropertyDescriptor) {
Reflect.defineMetadata(logKey, message, target, key);
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(Reflect.getMetadata(logKey, target, key));
const result = originalMethod.apply(this, args);
return result;
}
return descriptor;
}
}
class Example {
@log("Executing method")
myMethod(arg: string): string {
return `Method called with ${arg}`;
}
}
const example = new Example();
example.myMethod("Hello"); // åºåïŒ Executing method, Method called with Hello
ãã®äŸã§ã¯ãlogãã³ã¬ãŒã¿ãŒã¯Reflect Metadata APIã䜿çšããŠãã°ã¡ãã»ãŒãžãmyMethodã¡ãœããã«é¢é£ä»ããŸããã¡ãœãããåŒã³åºããããšããã³ã¬ãŒã¿ãŒã¯ã¡ãã»ãŒãžãååŸããŠã³ã³ãœãŒã«ã«ãã°åºåããŸãã
ã¡ã¿ããŒã¿ããã°ã©ãã³ã°ã®äœ¿çšäŸ
ãã³ã¬ãŒã¿ãŒã䜿çšããã¡ã¿ããŒã¿ããã°ã©ãã³ã°ã«ã¯ã以äžã®ãããªå€ãã®å®çšçãªå¿çšäŸããããŸãïŒ
- ã·ãªã¢ã©ã€ãºãšãã·ãªã¢ã©ã€ãºïŒ ããããã£ã«ã¡ã¿ããŒã¿ã§æ³šéãä»ããJSONãä»ã®åœ¢åŒãžã®ã·ãªã¢ã©ã€ãº/ãã·ãªã¢ã©ã€ãºæ¹æ³ãå¶åŸ¡ããŸããããã¯ãå€éšAPIãããŒã¿ããŒã¹ããã®ããŒã¿ãæ±ãéãç¹ã«ç°ãªããã©ãããã©ãŒã éã§ããŒã¿å€æãå¿ èŠãšãã忣ã·ã¹ãã ïŒäŸïŒç°ãªãå°åæšæºéã§ã®æ¥ä»åœ¢åŒã®å€æïŒã§åœ¹ç«ã¡ãŸããåœéé éå äœæãæ±ãeã³ããŒã¹ãã©ãããã©ãŒã ãæ³åããŠãã ãããã¡ã¿ããŒã¿ã䜿çšããŠãååœããšã«æ£ããäœæåœ¢åŒãšæ€èšŒã«ãŒã«ãæå®ã§ããŸãã
- äŸåæ§ã®æ³šå ¥ïŒ ã¡ã¿ããŒã¿ã䜿çšããŠãã¯ã©ã¹ã«æ³šå ¥ããå¿ èŠãããäŸåé¢ä¿ãç¹å®ããŸããããã«ãããäŸåé¢ä¿ã®ç®¡çãç°¡çŽ åãããççµåãä¿é²ãããŸãããµãŒãã¹ãäºãã«äŸåãããã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ãèããŠã¿ãŸãããããã³ã¬ãŒã¿ãŒãšã¡ã¿ããŒã¿ã¯ãèšå®ã«åºã¥ããŠãµãŒãã¹ã¯ã©ã€ã¢ã³ãã®åçãªæ³šå ¥ã容æã«ããã¹ã±ãŒãªã³ã°ãšãã©ãŒã«ããã¬ã©ã³ã¹ãåäžãããããšãã§ããŸãã
- ããªããŒã·ã§ã³ïŒ æ€èšŒã«ãŒã«ãã¡ã¿ããŒã¿ãšããŠå®çŸ©ãããã³ã¬ãŒã¿ãŒã䜿çšããŠããŒã¿ãèªåçã«æ€èšŒããŸããããã«ãããããŒã¿ã®æŽåæ§ãä¿èšŒãããå®åçãªã³ãŒããåæžãããŸããäŸãã°ãã°ããŒãã«ãªéèã¢ããªã±ãŒã·ã§ã³ã¯ãæ§ã ãªå°åã®éèèŠå¶ã«æºæ ããå¿ èŠããããŸããã¡ã¿ããŒã¿ã¯ããŠãŒã¶ãŒã®å Žæã«åºã¥ããŠé貚圢åŒãçšèšç®ãååŒå¶éã®æ€èšŒã«ãŒã«ãå®çŸ©ããçŸå°ã®æ³åŸãžã®æºæ ãä¿èšŒã§ããŸãã
- ã«ãŒãã£ã³ã°ãšããã«ãŠã§ã¢ïŒ ã¡ã¿ããŒã¿ã䜿çšããŠãWebã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒããšããã«ãŠã§ã¢ãå®çŸ©ããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®èšå®ãç°¡çŽ åãããä¿å®æ§ãåäžããŸããäžçäžã«åæ£ããã³ã³ãã³ãé ä¿¡ãããã¯ãŒã¯ïŒCDNïŒã¯ãã¡ã¿ããŒã¿ã䜿çšããŠãã³ã³ãã³ãã®çš®é¡ãšãŠãŒã¶ãŒã®å Žæã«åºã¥ããŠãã£ãã·ã¥ããªã·ãŒãšã«ãŒãã£ã³ã°ã«ãŒã«ãå®çŸ©ããäžçäžã®ãŠãŒã¶ãŒã®ããã©ãŒãã³ã¹ãæé©åããé å»¶ãåæžã§ããŸãã
- èªå¯ãšèªèšŒïŒ ããŒã«ãæš©éãèªèšŒèŠä»¶ãã¡ãœãããã¯ã©ã¹ã«é¢é£ä»ãã宣èšçãªã»ãã¥ãªãã£ããªã·ãŒã容æã«ããŸããç°ãªãéšéãå Žæã«ããåŸæ¥å¡ãæã€å€åœç±äŒæ¥ãæ³åããŠãã ããããã³ã¬ãŒã¿ãŒã¯ããŠãŒã¶ãŒã®åœ¹å²ãéšéãå Žæã«åºã¥ããŠã¢ã¯ã»ã¹å¶åŸ¡ã«ãŒã«ãå®çŸ©ããèš±å¯ãããæ åœè ã®ã¿ãæ©å¯ããŒã¿ãæ©èœã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãã
ãã¹ããã©ã¯ãã£ã¹
JavaScriptãã³ã¬ãŒã¿ãŒã䜿çšããéã¯ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããïŒ
- ãã³ã¬ãŒã¿ãŒã¯ã·ã³ãã«ã«ä¿ã€ïŒ ãã³ã¬ãŒã¿ãŒã¯çŠç¹ãçµããåäžã®æç¢ºã«å®çŸ©ãããã¿ã¹ã¯ãå®è¡ããããã«ãã¹ãã§ããå¯èªæ§ãšä¿å®æ§ãç¶æããããã«ããã³ã¬ãŒã¿ãŒå ã®è€éãªããžãã¯ã¯é¿ããŠãã ããã
- ãã³ã¬ãŒã¿ãŒãã¡ã¯ããªã䜿çšããïŒ èšå®å¯èœãªãã³ã¬ãŒã¿ãŒãèš±å¯ããããã«ãã³ã¬ãŒã¿ãŒãã¡ã¯ããªã䜿çšããŸããããã«ããããã³ã¬ãŒã¿ãŒãããæè»ã§åå©çšå¯èœã«ãªããŸãã
- å¯äœçšãé¿ããïŒ ãã³ã¬ãŒã¿ãŒã¯äž»ã«è£ 食ãããèŠçŽ ã®å€æŽãã¡ã¿ããŒã¿ã®é¢é£ä»ãã«éäžãã¹ãã§ããã³ãŒãã®çè§£ããããã°ãå°é£ã«ããå¯èœæ§ã®ããè€éãªå¯äœçšããã³ã¬ãŒã¿ãŒå ã§å®è¡ããããšã¯é¿ããŠãã ããã
- TypeScriptã䜿çšããïŒ TypeScriptã¯ãåãã§ãã¯ãIntelliSenseãªã©ããã³ã¬ãŒã¿ãŒã«å¯ŸããåªãããµããŒããæäŸããŸããTypeScriptã䜿çšããããšã§ããšã©ãŒãæ©æã«çºèŠããéçºäœéšãåäžãããããšãã§ããŸãã
- ãã³ã¬ãŒã¿ãŒãææžåããïŒ ãã³ã¬ãŒã¿ãŒã®ç®çãšäœ¿ç𿹿³ãæç¢ºã«ææžåããŠãã ãããããã«ãããä»ã®éçºè ãããªãã®ãã³ã¬ãŒã¿ãŒãæ£ããçè§£ãã䜿çšããã®ã容æã«ãªããŸãã
- ããã©ãŒãã³ã¹ãèæ ®ããïŒ ãã³ã¬ãŒã¿ãŒã¯åŒ·åã§ãããããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããç¹ã«ããã©ãŒãã³ã¹ãéèŠãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã³ã¬ãŒã¿ãŒã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ã«æ³šæããŠãã ããã
ãã³ã¬ãŒã¿ãŒã«ããåœéåã®äŸ
ãã³ã¬ãŒã¿ãŒã¯ããã±ãŒã«åºæã®ããŒã¿ãæ¯ãèããã³ãŒãã³ã³ããŒãã³ãã«é¢é£ä»ããããšã§ãåœéåïŒi18nïŒãšå°ååïŒl10nïŒãæ¯æŽã§ããŸãïŒ
äŸïŒå°ååãããæ¥ä»ãã©ãŒããã
import 'reflect-metadata';
interface DateFormatOptions {
locale: string;
options?: Intl.DateTimeFormatOptions;
}
const dateFormatKey = 'dateFormat';
function formatDate(options: DateFormatOptions) {
return function(target: any, propertyKey: string) {
Reflect.defineMetadata(dateFormatKey, options, target, propertyKey);
};
}
class Event {
@formatDate({ locale: 'fr-FR', options: { year: 'numeric', month: 'long', day: 'numeric' } })
startDate: Date;
constructor(startDate: Date) {
this.startDate = startDate;
}
getFormattedStartDate(): string {
const options: DateFormatOptions = Reflect.getMetadata(dateFormatKey, Object.getPrototypeOf(this), 'startDate');
return this.startDate.toLocaleDateString(options.locale, options.options);
}
}
const event = new Event(new Date());
console.log(event.getFormattedStartDate()); // ãã©ã³ã¹èªåœ¢åŒã§æ¥ä»ãåºå
äŸïŒãŠãŒã¶ãŒã®å Žæã«åºã¥ããé貚ãã©ãŒããã
import 'reflect-metadata';
interface CurrencyFormatOptions {
locale: string;
currency: string;
}
const currencyFormatKey = 'currencyFormat';
function formatCurrency(options: CurrencyFormatOptions) {
return function(target: any, propertyKey: string) {
Reflect.defineMetadata(currencyFormatKey, options, target, propertyKey);
};
}
class Product {
@formatCurrency({ locale: 'de-DE', currency: 'EUR' })
price: number;
constructor(price: number) {
this.price = price;
}
getFormattedPrice(): string {
const options: CurrencyFormatOptions = Reflect.getMetadata(currencyFormatKey, Object.getPrototypeOf(this), 'price');
return this.price.toLocaleString(options.locale, { style: 'currency', currency: options.currency });
}
}
const product = new Product(99.99);
console.log(product.getFormattedPrice()); // ãã€ãã®ãŠãŒã圢åŒã§äŸ¡æ Œãåºå
å°æ¥ã®å±æ
JavaScriptãã³ã¬ãŒã¿ãŒã¯é²åäžã®æ©èœã§ãããæšæºã¯ãŸã éçºäžã§ããå°æ¥ã®èæ ®äºé ã«ã¯ä»¥äžãå«ãŸããŸãïŒ
- æšæºåïŒ ãã³ã¬ãŒã¿ãŒã«é¢ããECMAScriptæšæºã¯ãŸã é²è¡äžã§ããæšæºãé²åããã«ã€ããŠããã³ã¬ãŒã¿ãŒã®æ§æãæ¯ãèãã«å€æŽããããããããŸããã
- ããã©ãŒãã³ã¹ã®æé©åïŒ ãã³ã¬ãŒã¿ãŒãããåºã䜿çšãããããã«ãªãã«ã€ããŠãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«æªåœ±é¿ãäžããªãããã«ããããã®ããã©ãŒãã³ã¹æé©åãå¿ èŠã«ãªããŸãã
- ããŒã«ãµããŒãïŒ IDEã®çµ±åããããã°ããŒã«ãªã©ããã³ã¬ãŒã¿ãŒã«å¯ŸããããŒã«ãµããŒããæ¹åãããããšã§ãéçºè ããã³ã¬ãŒã¿ãŒã广çã«äœ¿çšãããããªããŸãã
çµè«
JavaScriptãã³ã¬ãŒã¿ãŒã¯ãã¡ã¿ããŒã¿ããã°ã©ãã³ã°ãå®è£ ããã³ãŒãã®æ¯ãèãã匷åããããã®åŒ·åãªããŒã«ã§ãããã³ã¬ãŒã¿ãŒã䜿çšããããšã§ãã¯ãªãŒã³ã§å®£èšçããã€åå©çšå¯èœãªæ¹æ³ã§æ©èœã远å ã§ããŸããããã«ãããããä¿å®æ§ãé«ãããã¹ãå¯èœã§ãã¹ã±ãŒã©ãã«ãªã³ãŒããå®çŸããŸããããŸããŸãªçš®é¡ã®ãã³ã¬ãŒã¿ãŒãšãããã广çã«äœ¿çšããæ¹æ³ãçè§£ããããšã¯ãçŸä»£ã®JavaScriptéçºã«ãšã£ãŠäžå¯æ¬ ã§ãããã³ã¬ãŒã¿ãŒã¯ãç¹ã«Reflect Metadata APIãšçµã¿åãããããšã§ãäŸåæ§ã®æ³šå ¥ãããªããŒã·ã§ã³ããã·ãªã¢ã©ã€ãºãã«ãŒãã£ã³ã°ãŸã§ãããŸããŸãªå¯èœæ§ãåãéããã³ãŒãããã衚çŸè±ãã§ç®¡çããããããŸãã